﻿/*-----------------------------------------------------------------------
 * <copyright file="FunctionClass.cs" company="O-RID">
 *     Copyright (c)2010 O-RID Co.,Ltd.
 * </copyright>
 * <author>zhangjun</author>
 * <summary>
 * 
 *         公共方法
 *
 *          07/05/2010 可选择的 登录提示图标。
 *          07/19/2010 增加 取得当前版本号。 
 *          08/05/2010 增加 计算两个日期相差多少天。
 *          08/06/2010 增加 清除动态生成的列/将指定日期的星期变为日本格式。
 *          10/19/2010 增加 静态的TOOLTIP方法。
 *          10/20/2010 增加 根据错误类型，返回不同的提示信息。
 *          10/21/2010 修改 天数差值改为精确到天，不是小时。
 *          11/04/2010 增加 取得用户的身份类别
 *          11/12/2010 增加 对当前用户的权限进行修改
 *          07/01/2011 增加 特殊用户SPECIAL 和 特殊权限QC-P
 *
 *</summary>
 *-----------------------------------------------------------------------
 */
namespace Orid.Management.Statistics.OperatorUnitMangement.Common.FunctionList
{
    using System;
    using System.Collections.Generic;
    using System.Reflection;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Controls.Primitives;

    /// <summary>
    /// 自定义的公有方法类 FunctionClass
    /// </summary>
    public class FunctionClass
    {
        private FunctionClass() { }

        #region  自定义弹出消息窗体
        /// <summary>
        /// 自定义弹出消息窗体 ShowMessageBox
        /// 没有自定义关闭事件
        /// </summary>
        /// <param name="messbox">子窗体对象 messbox</param>
        /// <param name="number">消息级别 【0】提示级 【1】错误级</param>
        /// <param name="title">提示框标题 title</param>
        /// <param name="messageList">内容 messageList</param>
        /// <param name="backColor">背景色 backColor</param>
        /// <param name="closeButton">是否有关闭按钮 closeButton</param>
        /// <param name="buttonOfOK">是否显示 OK按钮 Visibility</param>
        /// <param name="canenlVis">是否显示 cancel按钮 canenlVis </param>
        public static void ShowMessageBox(
            Common.Window.MessageBox messbox, 
            int number,
            string title, 
            string messageList, 
            Color backColor,
            bool closeButton,
            Visibility buttonOfOK, 
            Visibility canenlVis)
        {
            // 消息子窗口  07/05/2010 -- add --
            BitmapImage bi = null;
            switch (number)
            {
                //提示级
                case 0:
                    messbox.Foreground = new SolidColorBrush(Colors.Blue);
                    bi = new BitmapImage(new Uri(((App)Application.Current).imageUriList[0].ToString(), UriKind.RelativeOrAbsolute));
                    messbox.ImageSource.Source = bi;
                    break;
                //错误级
                case 1:
                    messbox.Foreground = new SolidColorBrush(Colors.Red);
                    bi = new BitmapImage(new Uri(((App)Application.Current).imageUriList[1].ToString(), UriKind.RelativeOrAbsolute));
                    messbox.ImageSource.Source = bi;
                    break;
            }

            messbox.Title = title.ToString();
            messbox.OverlayBrush = new SolidColorBrush(backColor);
            messbox.Opacity = 0.9;
            messbox.HasCloseButton = closeButton;
            messbox.OverlayOpacity = 0.9;   
            messbox.messboxText.Text = messageList;
            messbox.OKButton.Visibility = buttonOfOK;
            messbox.CancelButton.Visibility = canenlVis;
            messbox.Show();
        }
        #endregion

        #region 自定义IsNullOrEmpty
        /// <summary>
        /// 自定义 IsNullOrEmpty
        /// </summary>
        /// <param name="inputStr">要判断的值 inputStr</param>
        /// <param name="retStr">当为FALSE时返回的值 retStr</param>
        /// <returns>结果字符串 string</returns>
        public static string MyIsNullOrEmpty(string inputStr, string retStr) 
        {
            return !string.IsNullOrEmpty(inputStr) ? inputStr : retStr;
        }

        #endregion 自定义IsNullOrEmpty

        #region 对字段格式化 MyToFormat
        /// <summary>
        /// 对字段格式化 MyToFormat
        /// 格式化千位分割符（DOUBLE类型） --06/02/2010--ADD
        /// 格式化日期（DATETIME类型）
        /// </summary>
        /// <param name="inputStr">字段名 inputStr</param>
        /// <param name="varClass">传入字符 varClas </param>
        /// <param name="format">字符串格式 format</param>
        /// <returns>返回结果 字符串 MyToFormat </returns>
        public static string MyToFormat(string inputStr, string varClass, string format)
        {
            switch (varClass.ToUpper())
            {
                case "DOUBLE":

                    if (!string.IsNullOrEmpty((!string.IsNullOrEmpty(inputStr) ? inputStr : string.Empty)))
                    {
                        return Convert.ToDouble(inputStr).ToString(format);
                    }

                    break;

                case "DATETIME":

                    if (!string.IsNullOrEmpty((!string.IsNullOrEmpty(inputStr) ? inputStr : string.Empty)))
                    {
                        return Convert.ToDateTime(inputStr).ToString(format);
                    }

                    break;
            }

            return string.Empty;
        }
        #endregion 对字段格式化 MyToFormat

        #region 查询 约束条件
        /// <summary>
        /// 查询 约束条件
        /// 06/02/2010 --增加日期约束
        /// </summary>
        /// <param name="date_From">开始日期 date_From</param>
        /// <param name="date_To">结束日期 date_To</param>
        /// <param name="dateTextBox">OPID TEXTBOX框</param>
        /// <param name="errorMessbox">消息提示框 errorMessbox</param>
        /// <returns>1:正确 0:不正确</returns>
        public static int IsSelectDo(
                                    DatePicker date_From, 
                                    DatePicker date_To, 
                                    TextBox dateTextBox,
                                    Common.Window.MessageBox errorMessbox)
        {
            int retNum = 1;

            // this.tbOPID.Text dpDateFrom dpDateTo内容必选的判断
            if (String.IsNullOrEmpty(dateTextBox.Text) || String.IsNullOrEmpty(date_From.Text) || String.IsNullOrEmpty(date_To.Text))
            {
                 ShowMessageBox(
                      errorMessbox,
                      1,
                      "填写正确的查询条件",
                      "开始日期、结束日期、" + dateTextBox.Tag.ToString() + "这三项查询条件不能为空值！",
                      Colors.Gray,
                      true,
                      Visibility.Visible,
                      Visibility.Collapsed);
                return 0;
            }
            else
            {
                retNum = CheckDate(date_From, date_To, errorMessbox);
            }
      
            return retNum;
        }
  
        /// <summary>
        /// 查询 约束条
        /// </summary>
        /// <param name="date_From">开始日期 date_From</param>
        /// <param name="date_To">结束日期 date_T</param>
        /// <param name="errorMessbox">消息提示框 errorMessbox</param>
        /// <returns>1:正确 0:不正确</returns>
        /// <value>06/02/2010 --增加日期约束</value>
        public static int IsSelectDo(
                                    DatePicker date_From, 
                                    DatePicker date_To,  
                                    Common.Window.MessageBox errorMessbox)
        {
            int retNum = 1;

            // this.tbOPID.Text dpDateFrom dpDateTo内容必选的判断
            if (String.IsNullOrEmpty(date_From.Text) || String.IsNullOrEmpty(date_To.Text))
            {
                ShowMessageBox(
                     errorMessbox,
                     1,
                     "填写正确的查询条件",
                     "开始日期、结束日期 这二项查询条件不能为空值！",
                     Colors.Gray,
                     true,
                     Visibility.Visible,
                     Visibility.Collapsed);
                return 0;
            }
            else
            {  
                retNum = CheckDate(date_From, date_To, errorMessbox);
            }

            return retNum;
        }

        /// <summary>
        /// 日期检查 CheckDate
        /// </summary>
        /// <param name="date_From">开始时间 date_From</param>
        /// <param name="date_To">结束时间 date_To</param>
        /// <param name="errorMessbox">错误提示框 errorMessbox</param>
        /// <returns>1:正确 0:不正确</returns>
        private static int CheckDate(DatePicker date_From, DatePicker date_To, Common.Window.MessageBox errorMessbox)
        {
            int retNum = 1;

            // 开始日期不能小于 03/08/2010
            if (date_From.SelectedDate.Value < Convert.ToDateTime("2010-02-01"))
            {
                ShowMessageBox(
                      errorMessbox,
                      1,
                      "填写正确的查询条件",
                      "开始日期不能小于 2010-02-01",
                      Colors.Gray,
                      true,
                      Visibility.Visible,
                      Visibility.Collapsed);
                return 0;
            }

            // 开始日期大于结束日期
            if (date_From.SelectedDate.Value > date_To.SelectedDate.Value)
            {
                ShowMessageBox(
                     errorMessbox,
                     1,
                     "填写正确的查询条件",
                     "开始日期大于结束日期",
                     Colors.Gray,
                     true,
                     Visibility.Visible,
                     Visibility.Collapsed);
                return 0;
            }

            // 日期不能相同
            if (date_From.SelectedDate.ToString() == date_To.SelectedDate.ToString())
            {
                ShowMessageBox(
                     errorMessbox,
                     1,
                     "填写正确的查询条件",
                     "开始日期、结束日期 的值不能相同",
                     Colors.Gray,
                     true,
                     Visibility.Visible,
                     Visibility.Collapsed);
                return 0;
            }

            return retNum;
        }
        #endregion 查询 约束条件        

        #region 取得当前版本号
        /// <summary>
        /// 取得当前版本 的 版本号
        /// </summary>
        /// <param name="isShort">true:短版本号 false:长版本号</param>
        /// <returns>当前版本号</returns>
        /// <value>
        /// 04/27/2011 修改 可返回长短两种版本号
        /// </value>
        public static string GetFormatedVersion(bool isShort)
        {
            Assembly assembly = Assembly.GetExecutingAssembly();
            string[] str = assembly.FullName.Split(',');

            StringBuilder sbVersion = new StringBuilder();

            if (isShort) 
            {
                sbVersion.AppendFormat("{0}",
                                    str[1] == "" ? "" : "v" + str[1].Substring(str[1].IndexOf("=") + 1, str[1].Length - 9)
                                    );
            }
            else
            {
                sbVersion.AppendFormat("{0}    {1}",
                                    str[0] == "" ? "OperatorUnitManagement" : str[0].ToString(),
                                    str[1] == "" ? "" : "v" + str[1].Substring(str[1].IndexOf("=") + 1, str[1].Length - 9)
                                    );
            }

            return sbVersion.ToString();
        }
        #endregion 取得当前版本号

        #region 计算两个日期相差多少天
        /// <summary>
        /// 计算两个日期相差多少天
        /// </summary>
        /// <param name="DateTime1">开始日期</param>
        /// <param name="DateTime2">结束日期</param>
        /// <returns>相差天数</returns>
        /// <value>10/21/2010 Edit 天数差值改为精确到天，不是小时</value>
        public static int DateDiff(DateTime DateTime1, DateTime DateTime2)
        {

            int dateDiff = -1;
            try
            {
                //相差日期精确到小时分秒
                //TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
                //TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
                //dateDiff = ts.Days.ToString() + "天" + ts.Hours.ToString() + "小时" + ts.Minutes.ToString() + "分钟" + ts.Seconds.ToString() + "秒";

                //不需要精确到小时分秒，精确到天
                TimeSpan ts = DateTime2.Date - DateTime1.Date;
                dateDiff = Convert.ToInt32(ts.Days);
              
            }
            catch
            {
            }
            return dateDiff;
        }
        #endregion 计算两个日期相差多少天

        #region 清除动态生成的列
        /// <summary>
        /// 清除动态生成的列
        /// </summary>
        /// <param name="gdDataGrid">DataGrid</param>
        /// <param name="columnNum">现有的COL数量</param>
        /// <value>08/06/2010--ADD</value>
        public static void clearColumn(DataGrid gdDataGrid, int columnNum)
        {
            //columnNum是已存在的、固定的COL数量
            if (gdDataGrid.Columns.Count > columnNum)
            {
                //得到没清除时的COL总数
                int sumi = gdDataGrid.Columns.Count;

                for (int i = columnNum; i < sumi; i++)
                {
                    //清除指定的 col[常数] 
                    //(当清除COL[5]时，原来的COL[6]自动变为COL[5].所以清除时，清除固定的下标号)
                    gdDataGrid.Columns.RemoveAt(columnNum);
                }
            }
        }
        #endregion 清除动态生成的列

        #region 将指定日期的星期变为日本格式
        /// <summary>
        /// 将指定日期的星期变为日本格式
        /// </summary>
        /// <param name="startTime">开始日期</param>
        /// <returns>yyyy-MM-dd 日本星期格式</returns>
        /// <value>08/06/2010--Add </value>
        public static string setDataTimeFormat(DateTime startTime)
        {
            StringBuilder retDateAndWeek = new StringBuilder();

            try
            {
                retDateAndWeek.Append(startTime.ToString("yyy-MM-dd"));

                DayOfWeek week = startTime.DayOfWeek;

                StringBuilder space = new StringBuilder();
                for (int i = 0; i < 10; i++)
                {
                    space.Append(" ");
                }

                switch ((int)week)
                {
                    //Sunday = 0,星期日。
                    case 0:
                        retDateAndWeek.Append("\n");
                        retDateAndWeek.Append(space.ToString()+"日");
                        break;

                    //表示星期一。
                    //Monday = 1,
                    case 1:
                        retDateAndWeek.Append("\n");
                        retDateAndWeek.Append(space.ToString() + "月");
                        break;

                    //表示星期二。
                    //Tuesday = 2,
                    case 2:
                        retDateAndWeek.Append("\n");
                        retDateAndWeek.Append(space.ToString() + "火");
                        break;

                    //表示星期三。
                    //Wednesday = 3,
                    case 3:
                        retDateAndWeek.Append("\n");
                        retDateAndWeek.Append(space.ToString() + "水");
                        break;

                    //表示星期四。
                    //Thursday = 4,
                    case 4:
                        retDateAndWeek.Append("\n");
                        retDateAndWeek.Append(space.ToString() + "木");
                        break;

                    //表示星期五。
                    // Friday = 5,
                    case 5:
                        retDateAndWeek.Append("\n");
                        retDateAndWeek.Append(space.ToString() + "金");
                        break;

                    //表示星期六。
                    //Saturday = 6,
                    case 6:
                        retDateAndWeek.Append("\n");
                        retDateAndWeek.Append(space.ToString() + "土");
                        break;

                }

            }
            catch
            {
                retDateAndWeek.Append("NONE");
            }

            return retDateAndWeek.ToString();
        }
        #endregion 将指定日期的星期变为日本格式

        #region 设置控件的ToolTip
        /// <summary>
        /// 设置控件的ToolTip
        /// </summary>
        /// <param name="element">The element.有ToolTipService依赖属性的控件</param>
        /// <param name="placementValue">The placement value. 提示信息出现的位置（PlacementMode）</param>
        /// <param name="value">The value.提示内容</param>
        /// <value>10/19/2010 Add</value>
        public static void SetToolTipText(DependencyObject element, PlacementMode placementValue, object value) 
        {
            ToolTipService.SetToolTip(element, value);
            ToolTipService.SetPlacement(element, placementValue);
        }
        #endregion 设置控件的ToolTip

        #region 根据错误类型，返回不同的提示信息
        /// <summary>
        /// 根据错误类型，返回不同的提示信息
        /// </summary>
        /// <param name="ex">错误类</param>
        /// <returns>错误的具体提示信息</returns>
        /// <value>10/20/2010　Add</value>
        public static string GetMessageInformation(Exception ex) 
        {
            if (ex == null) { return "提示信息类型错误！"; }

            if (ex is System.NullReferenceException) 
            {
                //WCF返回一个空对象
                return "服务返回值有误，稍后请重新查询！";
            }

            if (ex is System.TimeoutException) 
            {
                //WCF服务超时
                return "服务器端查询超时！服务器端繁忙，稍后请重新查询！";
            }

            return ex.Message;
        }
        #endregion 根据错误类型，返回不同的提示信息

        #region 取得用户的身份类别
        /// <summary>
        /// 取得用户的身份类别
        /// 主要用于，能不能看见 数据导出 按钮
        /// </summary>
        /// <returns></returns>
        /// <value>
        /// 11/04/2010 add 
        /// 07/01/2011 ADD 特殊权限QC-P
        /// </value>
        public static string GetUserIdentity() 
        {
            string retIdentity = string.Empty;

            if (!string.IsNullOrEmpty(ClientUserInfor.RoleName))
            {
                switch (ClientUserInfor.RoleName.Trim().ToUpper())
                {
                    case "ADMINISTRATOR":
                    case "ADMIN":
                    case "ADMIN-2":
                        retIdentity = UserIdentity.ADMIN.ToString();
                        break;
                    case "SSV":
                    case "SQC":
                        retIdentity = UserIdentity.SENIOR.ToString();
                        break;
                    
                    // 以下属于特殊组，可以看到 数据导出 按钮
                    case"QC-P":
                        retIdentity = UserIdentity.SPECIAL.ToString();
                        break;

                    // 以下不能看到 数据导出 按钮
                    case "SV":
                        retIdentity = UserIdentity.SV.ToString();
                        break;
                    case "QC":
                        retIdentity = UserIdentity.QC.ToString();
                        break;
                   

                }
            }
            else 
            {
                retIdentity = UserIdentity.SV.ToString();
            }
            return retIdentity; 
        }

        /// <summary>
        /// 用户种类
        /// </summary>
        /// <value>
        /// 11/04/2010 add 
        /// 07/01/2011 ADD 特殊用户
        /// </value>
        public enum UserIdentity 
        {
            /// <summary>
            /// 管理级用户(ADMINISTRATOR,ADMIN,ADMIN-2)
            /// </summary>
            ADMIN,
            /// <summary>
            /// 高级用户(SSV,SQC)
            /// </summary>
            SENIOR,
            /// <summary>
            /// SV
            /// </summary>
            SV,
            /// <summary>
            /// QC
            /// </summary>
            QC,
            /// <summary>
            /// 特殊用户
            /// </summary>
            SPECIAL
        }

        #endregion 取得用户的身份类别

        #region 对当前用户的权限进行修改
        /// <summary>
        /// 对当前用户的权限进行修改
        /// </summary>
        /// <param name="useId">用户id</param>
        /// <param name="isAddorSub">True：添加权限  False：删除权限</param>
        /// <param name="rootRole">权限ID（根结点）</param>
        /// <param name="roles">添加或是删除的权限ID（子结点,用逗号分隔）</param>
        /// <value>11/12/2010 Add </value>
        public static void AddOrSubRoles(string useId, bool isAddorSub, string rootRole, params string[] roles)
        {
            if (!string.IsNullOrEmpty(ClientUserInfor.UserName)||!ClientUserInfor.RoleID.Equals("0"))
            {

                // 添加 权限
                if (isAddorSub)
                {
                    if (ClientUserInfor.UserName.ToUpper().Trim().Equals(useId.ToUpper().Trim()))
                    {
                        AddRoles(rootRole, roles);
                    }
                }
                // 删除 权限
                else
                {

                }
            }
            else
            {
                throw new Exception("用户身份有误！");
            }
        }

        /// <summary>
        /// 添加权限
        /// </summary>
        /// <param name="rootRole">权限ID（根结点）</param>
        /// <param name="addroles">权限ID（子结点）</param>
        /// <returns></returns>
        /// <value>11/12/2010 Add </value>
        private static void AddRoles(string rootRole, params string[] addroles) 
        {
            if (!string.IsNullOrEmpty(ClientUserInfor.Condition)) 
            {
                //没有根权限，添加权限
                if (!ClientUserInfor.Condition.Contains(rootRole)) 
                {
                    ClientUserInfor.Condition += ",";
                    ClientUserInfor.Condition += rootRole;
                }
                //添加子权限
                foreach (string r in addroles) 
                {
                    ClientUserInfor.Condition += ",";
                    ClientUserInfor.Condition += r;
                }
            }
            else
            {
                throw new Exception("用户身份有误！");
            }
        }

        #endregion 对当前用户的权限进行修改

    }
}
